package com.tp2.etna.distribucion2.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.tp2.etna.distribucion2.constante.ConstanteDist2;
import com.tp2.etna.distribucion2.modelo.Recurso;

@Repository
public class RecursoDAOImpl implements RecursoDAO {

	@Autowired
    private DataSource dataSource;
	
	@Override
	public List<Recurso> obtenerTransportistas(int idHojaRuta) {
		List<Recurso> transportistas = new ArrayList<Recurso>();
		String query = " select r.codigo as codigo,"
				+ " r.dni as dni,"
				+ " r.nombre as nombre,"
				+ " r.apellidoPaterno as apePat"
				+ " from Recurso r"
				+ "	inner join disponibilidadRecurso dr"
				+ " on r.codigo = dr.idRecurso"
				+ " inner join Calendario c"
				+ " on c.codigo = dr.idCalendario"
				+ " where concat_ws('-',c.anio,c.mes,c.dia) = (select fecha from hojaRuta hr where hr.codigo = ?)"
				+ " and dr.disponible = '1'"
				+ " and r.idTipoRecurso = (select codigo from  TipoRecurso tr where tr.abreviatura = ?)"
                + " order by nombre,apellidoPaterno asc";     
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idHojaRuta);
            ps.setString(2, ConstanteDist2.TIPO_RECURSO_TRANSPORTISTA);

            rs = ps.executeQuery();
            while(rs.next()){
            	Recurso transportista = new Recurso();
            	transportista.setCodigo(rs.getInt("codigo"));
            	transportista.setDni(rs.getString("dni"));
            	transportista.setNombre(rs.getString("nombre"));
            	transportista.setApellidoPaterno(rs.getString("apePat"));
            	transportista.setNombreCompleto(transportista.getNombre()+ " "+transportista.getApellidoPaterno());
            	transportistas.add(transportista);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return transportistas;
	}

	@Override
	public List<Recurso> obtenerCopilotos(int idHojaRuta) {
		List<Recurso> copilotos = new ArrayList<Recurso>();
		String query = " select r.codigo as codigo,"
				+ " r.dni as dni,"
				+ " r.nombre as nombre,"
				+ " r.apellidoPaterno as apePat"
				+ " from Recurso r"
				+ "	inner join disponibilidadRecurso dr"
				+ " on r.codigo = dr.idRecurso"
				+ " inner join Calendario c"
				+ " on c.codigo = dr.idCalendario"
				+ " where concat_ws('-',c.anio,c.mes,c.dia) = (select fecha from hojaRuta hr where hr.codigo = ?)"
				+ " and dr.disponible = '1'"
				+ " and r.idTipoRecurso = (select codigo from  TipoRecurso tr where tr.abreviatura = ?)"
				+ " order by nombre,apellidoPaterno asc";       
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idHojaRuta);
            ps.setString(2, ConstanteDist2.TIPO_RECURSO_COPILOTO);

            rs = ps.executeQuery();
            while(rs.next()){
            	Recurso copiloto = new Recurso();
            	copiloto.setCodigo(rs.getInt("codigo"));
            	copiloto.setDni(rs.getString("dni"));
            	copiloto.setNombre(rs.getString("nombre"));
            	copiloto.setApellidoPaterno(rs.getString("apePat"));
            	copiloto.setNombreCompleto(copiloto.getNombre()+ " "+copiloto.getApellidoPaterno());
            	copilotos.add(copiloto);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return copilotos;
	}

	@Override
	public List<Recurso> obtenerAsistentes(int idHojaRuta) {
		List<Recurso> asistentes = new ArrayList<Recurso>();
		String query = " select r.codigo as codigo,"
				+ " r.dni as dni,"
				+ " r.nombre as nombre,"
				+ " r.apellidoPaterno as apePat"
				+ " from Recurso r"
				+ "	inner join disponibilidadRecurso dr"
				+ " on r.codigo = dr.idRecurso"
				+ " inner join Calendario c"
				+ " on c.codigo = dr.idCalendario"
				+ " where concat_ws('-',c.anio,c.mes,c.dia) = (select fecha from hojaRuta hr where hr.codigo = ?)"
				+ " and dr.disponible = '1'"
				+ " and r.idTipoRecurso = (select codigo from  TipoRecurso tr where tr.abreviatura = ?)"
				+ " order by nombre,apellidoPaterno asc";      
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idHojaRuta);
            ps.setString(2, ConstanteDist2.TIPO_RECURSO_ASISTENTE);

            rs = ps.executeQuery();
            while(rs.next()){
            	Recurso asistente = new Recurso();
            	asistente.setCodigo(rs.getInt("codigo"));
            	asistente.setDni(rs.getString("dni"));
            	asistente.setNombre(rs.getString("nombre"));
            	asistente.setApellidoPaterno(rs.getString("apePat"));
            	asistente.setNombreCompleto(asistente.getNombre()+ " "+asistente.getApellidoPaterno());
            	asistentes.add(asistente);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return asistentes;
	}

	@Override
	public boolean asignarTransportistaHojaRuta(Integer idHojaRuta,
			Integer idTransportista) {
		String query = "insert into HojaRutaRecurso(idRecurso,idHojaRuta) values(?,?)";
		String query2 = "update DisponibilidadRecurso set disponible = 0"
				+ " where idRecurso = ?"
				+ " and idCalendario = "
				+ " (select codigo from Calendario c where concat_ws('-',c.anio,c.mes,c.dia) = "
						+ " (select fecha from hojaRuta hr where hr.codigo = ?))";
        Connection con = null;
        PreparedStatement ps = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idTransportista);
            ps.setInt(2,idHojaRuta);
            int out = ps.executeUpdate();
            if(out !=0){
            	ps.close();
            	ps = con.prepareStatement(query2);
            	ps.setInt(1, idTransportista);
            	ps.setInt(2,idHojaRuta);
            	int result = ps.executeUpdate();
            	if(result == 1)
            	return true;
            	
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
	}

	@Override
	public boolean asignarCopilotoHojaRuta(Integer idHojaRuta,
			Integer idCopiloto) {
		String query = "insert into HojaRutaRecurso(idRecurso,idHojaRuta) values(?,?)";
		String query2 = "update DisponibilidadRecurso set disponible = 0"
				+ " where idRecurso = ?"
				+ " and idCalendario = "
				+ " (select codigo from Calendario c where concat_ws('-',c.anio,c.mes,c.dia) = "
						+ " (select fecha from hojaRuta hr where hr.codigo = ?))";
        Connection con = null;
        PreparedStatement ps = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idCopiloto);
            ps.setInt(2,idHojaRuta);
            int out = ps.executeUpdate();
            if(out !=0){
            	ps.close();
            	ps = con.prepareStatement(query2);
            	ps.setInt(1, idCopiloto);
            	ps.setInt(2,idHojaRuta);
            	int result = ps.executeUpdate();
            	if(result == 1)
            	return true;
            	
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
	}

	@Override
	public boolean asignarAsistenteHojaRuta(Integer idHojaRuta,
			Integer idAsistente) {
		String query = "insert into HojaRutaRecurso(idRecurso,idHojaRuta) values(?,?)";
		String query2 = "update DisponibilidadRecurso set disponible = 0"
				+ " where idRecurso = ?"
				+ " and idCalendario = "
				+ " (select codigo from Calendario c where concat_ws('-',c.anio,c.mes,c.dia) = "
						+ " (select fecha from hojaRuta hr where hr.codigo = ?))";
        Connection con = null;
        PreparedStatement ps = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idAsistente);
            ps.setInt(2,idHojaRuta);
            int out = ps.executeUpdate();
            if(out !=0){
            	ps.close();
            	ps = con.prepareStatement(query2);
            	ps.setInt(1, idAsistente);
            	ps.setInt(2,idHojaRuta);
            	int result = ps.executeUpdate();
            	if(result == 1)
            	return true;
            	
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
	}

}
